#include "XGraphics.h"
#include <math.h>

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
XGraphics::XGraphics()
{
	mDisplay = NULL;
	mScreen = 0;
	mGC = NULL;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
XGraphics::~XGraphics()
{
	Detach();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::Detach()
{
	Graphics::Detach();
	if(mDisplay!=NULL)
	{
		mDisplay = NULL;
		mDrawable = 0;
		mGC = 0;
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::Attach(DisplayContext *theContext)
{
	Graphics::Attach(theContext);
	mDisplay = theContext->mDisplay;
	mDrawable = theContext->mDrawable;
	mScreen = theContext->mScreen;
	mColorMap = theContext->mColormap;
	mGC = theContext->mGC;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::SetPixelHook(int x, int y, DWORD theColor)
{
	DWORD anOldColor = mColor;
	SetColor(theColor);
	XDrawPoint(mDisplay, mDrawable, mGC, x, y);
	SetColor(anOldColor);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::SetColorHook()
{
	Status aStat;

/*	XColor aColor;
	aColor.red = (theColor&0xff0000)>>8;
	aColor.green = (theColor&0x00ff00);
	aColor.blue = (theColor&0xff)<<8;
	aStat = XAllocColor(mDisplay, mColorMap, &aColor);
	if(aStat!=BadColor)
		printf("SetColor: BadColor.\n");	
*/

	unsigned long aPixel = mDisplayContext->AllocColor(mColor);

	aStat = XSetForeground(mDisplay, mGC, aPixel);
	aStat = XSetBackground(mDisplay, mGC, aPixel);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::DrawLineHook(int x1, int y1, int x2, int y2)
{
	XDrawLine(mDisplay, mDrawable, mGC, x1, y1, x2, y2);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::DrawRectHook(int x, int y, int width, int height)
{
	XDrawRectangle(mDisplay, mDrawable, mGC, x, y, width-1, height-1);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::FillRectHook(int x, int y, int width, int height)
{
	XFillRectangle(mDisplay, mDrawable, mGC, x, y, width, height);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::DrawDottedRectHook(int x, int y, int width, int height)
{
	Graphics::DrawDottedRectHook(x,y,width,height);
//	DrawRectHook(x,y,width,height);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::DrawEllipseHook(int x, int y, int width, int height)
{
	XDrawArc(mDisplay, mDrawable, mGC, x, y, width-1, height-1, 0, 360*64);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::FillEllipseHook(int x, int y, int width, int height)
{
	XFillArc(mDisplay, mDrawable, mGC, x, y, width, height, 0, 360*64);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::DrawArcHook(int x, int y, int width, int height, int startAngle, int arcAngle)
{
	XDrawArc(mDisplay, mDrawable, mGC, x, y, width-1, height-1, startAngle*64, arcAngle*64);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::ClearClipRectHook()
{
	XSetClipMask(mDisplay, mGC, None);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void XGraphics::SetClipRectHook(int x, int y, int width, int height)
{
	XRectangle anXRect = {x, y, width, height};	
	XSetClipRectangles(mDisplay, mGC, 0, 0, &anXRect, 1, Unsorted);
}

